package top.saodisheng.config;

import top.saodisheng.filter.HelloWorldFilter;
import top.saodisheng.servlet.HelloWorldServlet;

import javax.servlet.*;
import java.util.EnumSet;
import java.util.Set;

/**
 * description:
 * 自定义Servlet初始化器，从而解除使用web.xml
 * HelloWorldFilter 和 HelloWorldServlet 没有变动，新增了一个 CustomServletContainerInitializer 对象，
 * 它实现了 javax.servlet.ServletContainerInitializer 接口，用来在 Web 容器启动时加载需要的 Servlet 和 Filter
 *
 * 注意，单单这样声明一个ServletInitializer的实现类，Web容器并不会识别她，需要借助SPI机制来指定该初始化类，通过在项目
 * ClassPath路径下创建META-INF/services/javax.servlet.ServletContainerInitializer文件做到，其中内容为:
 * top.saodisheng.config.CustomServletContainerInitializer
 *
 * @author 扫地生_saodisheng
 * @date 2021/10/10
 */
public class CustomServletContainerInitializer implements ServletContainerInitializer {
	/**
	 * 在实现的onStartup方法中向ServletContext对象（Servlet上下文）添加之前在web.xml中配置的
	 * HelloWorldServlet和HelloWorldFilter，这样一来就可以去除web.xml文件了
	 *
	 * 参数中的Set<Class<?>> set 是和@HandlesTypes注解结合使用的，指定需要处理的Class类，可以参考
	 * Spring中的SpringServletContainerInitializer使用方法。
	 * @author saodisheng_liuxingwu
	 * @modifyDate 2021/10/10
	*/
	@Override
	public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
		System.out.println("创建Hello World Servlet...");
		ServletRegistration.Dynamic helloServlet = servletContext.addServlet(HelloWorldServlet.class.getSimpleName(), HelloWorldServlet.class);
		helloServlet.addMapping("/hello");

		System.out.println("创建Hello World Filter...");
		FilterRegistration.Dynamic helloFilter = servletContext.addFilter(HelloWorldFilter.class.getSimpleName(), HelloWorldFilter.class);
		EnumSet<DispatcherType> dispatcherTypes = EnumSet.allOf(DispatcherType.class);
		dispatcherTypes.add(DispatcherType.REQUEST);
		dispatcherTypes.add(DispatcherType.FORWARD);
		helloFilter.addMappingForUrlPatterns(dispatcherTypes, true, "/hello");
	}
}
